package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpChangesDAO;
import org.jsola.hr.dto.ConfirmLeaveOfficeDTO;
import org.jsola.hr.dto.EmpChangeCompanyDTO;
import org.jsola.hr.dto.EmpChangesAddDTO;
import org.jsola.hr.dto.EmpChangesUpdateDTO;
import org.jsola.hr.dto.excel.EmpChangeImportDTO;
import org.jsola.hr.entity.EmpChangesDO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.query.EmpChangesQuery;
import org.jsola.hr.vo.*;
import org.jsola.hr.vo.excel.ParseResultVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * @author zhr
 */
public interface IEmpChangesService extends IService<IEmpChangesDAO, EmpChangesDO> {

    /**
     * 待调岗员工发通知
     *
     * @param subjectId      业务id（待调岗：hr_emp_changes表id; 待离职：hr_emp_changes表id; 离职：hr_emp_info表id）
     * @param noticeDate     通知时间
     * @param noticeTypeCode 通知类型code
     * @param tokenUser      当前用户
     */
    void sendNotice(String subjectId, String companyId, Date noticeDate, String noticeTypeCode, TokenUser tokenUser);

    /**
     * 新增员工人事变动记录
     *
     * @param empChangesAddDTO 新增员工人事变动记录DTO
     * @param tokenUser        当前用户
     * @return 员工人事变动记录详情信息
     */
    EmpChangesVO save(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 修改员工人事变动记录
     *
     * @param empChangesUpdateDTO 修改员工人事变动记录DTO
     * @param tokenUser           当前用户
     * @return 更新数量
     */
    int update(EmpChangesUpdateDTO empChangesUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工人事变动记录，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser     当前用户
     * @param empChangesIds 员工人事变动记录id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empChangesIds);

    /**
     * 根据员工人事变动记录id查找
     *
     * @param empChangesId 员工人事变动记录id
     * @param siteId       所属站点id
     * @return 员工人事变动记录详情信息
     */
    EmpChangesVO selectById(String empChangesId, String siteId);

    /**
     * 根据员工人事变动记录id查找
     *
     * @param empChangesIdList 员工人事变动记录id列表
     * @return 员工人事变动记录详情信息
     */
    List<EmpChangesDO> selectByIdList(List<String> empChangesIdList);

    /**
     * 查询员工人事变动记录
     *
     * @param empChangesQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工人事变动记录列表信息
     */
    List<EmpChangesListVO> select(EmpChangesQuery empChangesQuery, String siteId);

    /**
     * 查询员工人事变动记录记录数
     *
     * @param empChangesQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工人事变动记录记录数
     */
    int selectCount(EmpChangesQuery empChangesQuery, String siteId);

    /**
     * 分页查询员工人事变动记录
     *
     * @param empChangesQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工人事变动记录列表信息
     */
    Page<EmpChangesListVO> selectPage(EmpChangesQuery empChangesQuery, String siteId);


    /**
     * 根据员工人事变动记录id查找
     *
     * @param empChangesId 员工人事变动记录id
     * @param siteId       所属站点id
     * @return 员工人事变动记录
     */
    EmpChangesDO selectDOById(String empChangesId, String siteId);

    /**
     * 查询员工人事变动记录
     *
     * @param empChangesQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工人事变动记录列表
     */
    List<EmpChangesDO> selectDO(EmpChangesQuery empChangesQuery, String siteId);

    /**
     * 转正式
     *
     * @param empChangesAddDTO 转正式信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    EmpChangesVO transferFormal(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 批量转正
     *
     * @param empChangesAddDTO 转正信息
     * @param tokenUser        当前用户
     * @return
     */
    void batchTransferRegular(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 转正
     *
     * @param empChangesAddDTO 转正信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    EmpChangesVO transferRegular(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 调岗
     *
     * @param empChangesAddDTO 调岗信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    void batchTransferPosition(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);


    /**
     * 调岗
     *
     * @param empChangesAddDTO 调岗信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    EmpChangesVO transferPosition(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 批量离职
     *
     * @param empChangesAddDTO 离职信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    void batchLeavePosition(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 离职
     *
     * @param empChangesAddDTO 离职信息
     * @param tokenUser        当前用户
     * @return 员工人事变动记录
     */
    EmpChangesVO leavePosition(EmpChangesAddDTO empChangesAddDTO, TokenUser tokenUser);

    /**
     * 原有员工离职 + 确认离职
     *
     * @param empChangeCompanyDTO 员工原公司信息
     * @param tokenUser           当前用户
     * @return 失败原因
     */
    String leavePositionAndEntry(EmpChangeCompanyDTO empChangeCompanyDTO, TokenUser tokenUser);

    /**
     * 根据用户审批申请id获取变更记录
     *
     * @param userApproId 用户审批申请id
     * @param siteId      站点
     * @return 变更记录
     */
    EmpChangesVO findByUserApproId(String userApproId, String siteId);

    /**
     * 确认调岗
     *  @param empChangesId id
     * @param tokenUser    当前用户
     * @return 确认调岗数量
     */
    Integer confirmTransferPosition(String empChangesId, TokenUser tokenUser);

    /**
     * 根据员工变更id确认调岗
     *
     * @param empChangesId 员工变更id
     * @param tokenUser    当前用户
     * @return 结果
     */
    Integer confirmTransferPositionByChangesId(String empChangesId, TokenUser tokenUser);

    /**
     * 根据员工变更id确认调岗
     *
     * @param empIds    员工id数组
     * @param tokenUser 当前用户
     * @return 调岗数量
     */
    Integer batchConfirmTransferPosition(String[] empIds, TokenUser tokenUser);

    /**
     * 撤回调岗申请
     *
     * @param empChangesId id
     * @param tokenUser    当前用户
     */
    void revokeTransferPosition(String empChangesId, TokenUser tokenUser);

    /**
     * 修改申请状态
     *  @param id        员工变动记录Id
     * @param tokenUser 当前用户
     * @return 修改数量
     */
    Integer updateEmpChangeStatus(String id, TokenUser tokenUser);

    /**
     * 确认离职
     *  @param empChangesId id
     * @param tokenUser    当前用户
     * @return 确认离职数量
     */
    Integer confirmLeave(String empChangesId, TokenUser tokenUser);

    /**
     * 撤回离职申请
     *
     * @param empChangesId id
     * @param tokenUser    当前用户
     */
    void revokeLeave(String empChangesId, TokenUser tokenUser);

    /**
     * 获取最新一条某种类型的变更记录
     *
     * @param empId      员工id
     * @param changeType 变更类型
     * @param siteId     站点id
     * @return 最新一条某种类型的变更记录
     */
    String getLastChangesId(String empId, Integer changeType, String siteId);

    /**
     * 查询已调岗员工列表
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 已调岗员工列表
     */
    List<String> listTransferEmp(String companyId, String siteId);

    /**
     * 已离职列表
     *
     * @param companyId 公司Id
     * @param empName   名字
     * @param pageNo    页码
     * @param pageSize  页面大小
     * @param siteId    站点id
     * @return 已离职列表
     */
    Page<EmpChangesRelationVO> pageEmpResignedList(String companyId, String empName, Integer pageNo, Integer pageSize, String siteId);

    /**
     * 已离职列表
     *
     * @param empChangesQuery 查询条件
     * @param siteId          站点id
     * @return 已离职列表
     */
    List<EmpChangesRelationVO> empResignedList(EmpChangesQuery empChangesQuery, String siteId);

    /**
     * 已调岗列表
     *
     * @param companyId 公司Id
     * @param empName   名字
     * @param pageNo    页码
     * @param pageSize  页面大小
     * @param siteId    站点id
     * @return 已离职列表
     */
    Page<EmpChangesRelationVO> pageEmpTransferList(String companyId, String empName, Integer pageNo, Integer pageSize, String siteId);

    /**
     * 已调岗列表
     *
     * @param empChangesQuery 查询条件
     * @param siteId          站点id
     * @return 已离职列表
     */
    List<EmpChangesRelationVO> empTransferList(EmpChangesQuery empChangesQuery, String siteId);


    /**
     * 根据员工Id删除变动记录
     *
     * @param empIds    人员Id
     * @param tokenUser 登录用户
     * @return 根据员工Id删除变动记录
     */
    Integer deleteByEmpIds(List<String> empIds, TokenUser tokenUser);

    /**
     * 查询员工在公司的离职记录
     *
     * @param companyId 公司Id
     * @param empId     员工Id
     * @return 员工在公司的离职记录
     */
    List<EmpChangesDO> selectLeaveByCompanyIdAndEmpId(String companyId, String empId);

    /**
     * 确认离职
     *
     * @param confirmLeaveOfficeDTO 确认离职参数
     * @param tokenUser             当前用户
     * @return 返回结果
     */
    List<ConfirmLeaveOfficeListVO> checkAndConfirmLeaveOffice(ConfirmLeaveOfficeDTO confirmLeaveOfficeDTO, TokenUser tokenUser);

    /**
     * 确认离职(批量)
     *
     * @param confirmLeaveOfficeDTO 确认离职参数
     * @param tokenUser             当前用户
     * @return 返回结果
     */
    List<ConfirmLeaveOfficeListVO> checkAndConfirmLeaveOfficeBatch(ConfirmLeaveOfficeDTO confirmLeaveOfficeDTO, TokenUser tokenUser);

    /**
     * 错误数据导出
     *
     * @param errorList 错误列表
     * @param tokenUser 当前用户
     * @return 解析列表
     */
    String exportErrorList(ImportExcelResultListVO<EmpChangeImportDTO> errorList, TokenUser tokenUser);

    /**
     * 导入确认离职 excel
     *
     * @param file      文件
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 导入结果
     */
    ImportExcelResultListVO<EmpChangeImportDTO> importEmpChangeFile(File file, String companyId, TokenUser tokenUser);

    /**
     * 入库
     *
     * @param dataList     需要入库的数据
     * @param companyId    公司Id
     * @param idCardEmpMap 身份证号和员工的映射
     * @param tokenUser    当前用户
     */
    void confirmLeaveOfficeImportSaveDate(List<EmpChangeImportDTO> dataList, String companyId,
                                          Map<String, EmpInfoDO> idCardEmpMap, TokenUser tokenUser);

    /**
     * 查询最后一条未到时间的离职变动记录
     *
     * @param empId 员工id
     * @return 离职变动记录
     */
    EmpChangesDO selectLastResign(String empId);

    /**
     * 查询最后一条未到时间的调岗变动记录
     *
     * @param empId 员工id
     * @return 调岗变动记录
     */
    EmpChangesDO selectLastTransfer(String empId);

    /**
     * 获取离职变动记录
     *
     * @return 变动记录
     */
    EmpChangesDO selectResignByEmpId(String empId, String siteId);

    /**
     * 获取状态是初始值的调岗变动记录
     *
     * @param empId  员工id
     * @param siteId 租户id
     * @return 变动记录
     */
    EmpChangesDO selectTransferByEmpId(String empId, String siteId);


}


